package string;

/**
 * 字符串是不变对象，即:对象一旦创建内容不可改变，改变内容会创建新对象。
 *
 * java对字符串的一个优化措施:常量池
 * 常量池在堆内存中，java会自动重用使用字面量形式创建的字符串对象，减小不必要的开销。
 */
public class StringDemo {
    public static void main(String[] args) {
        String s1 = "123abc";//会创建对象
        String s2 = "123abc";//重用s1对象,s2保存的地址与s1相同
        System.out.println("s1:"+s1);
        System.out.println("s2:"+s2);
        System.out.println(s1==s2);
        String s3 = "123abc";
        System.out.println("s3:"+s3);
        System.out.println(s1==s3);
        //new一定创建新对象，并不推荐这样的做法
        String s4 = new String("123abc");
        System.out.println("s4:"+s4);
        System.out.println(s1==s4);
        /*
            触发了编译器的预计算特性:
            编译器编译代码时如果在编译期间可以确定一个计算表达式的结果时就会进行计算，并将结果
            替换这个表达式，例如下面的代码:
            String s5 = "123"+"abc";
            会被编译器改为:
            String s5 = "123abc";//class文件中的样子，因此s5会重用对象
         */
        String s5 = "123"+"abc";
        System.out.println("s5:"+s5);
        System.out.println(s1==s5);//true

        String s = "123";
        String s6 = s + "abc";//这里不会触发预计算特性
        System.out.println("s6:"+s6);
        System.out.println(s1==s6);//false


        s1 = s1 + "!";//修改内容就会创建新对象
        System.out.println("s1:"+s1);//123abc!
        System.out.println("s2:"+s2);
        System.out.println(s1==s2);//地址不同了


    }
}






